package generatore;

import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import linguaggio.Grammatica;

/**
 * La classe contiene dei metodi per manipolare i files.
 * Permette copia di files;
 * cancellazione;
 * salvataggio;
 * caricamento strutture dati.
 * 
 * @author Giovanni Cammarata
 */
public class ManipolaFile {
    
    /**
     * Permette di copiare un file su un altro.
     * @param srFile file sorgente;
     * @param dtFile file destinazione;
     * @param append append;
     * @return true se l'operazione va a buon fine.
     */
    public static boolean copiaFile(String srFile, String dtFile, boolean append) {
          try{
              
              System.out.println(srFile+" -> "+ dtFile);
            File f1 = new File(srFile);
            File f2 = new File(dtFile);
            InputStream in = new FileInputStream(f1);

              OutputStream out = new FileOutputStream(f2,append);

              byte[] buf = new byte[1024];
              int len;
              while ((len = in.read(buf)) > 0){
              out.write(buf, 0, len);
              }
              in.close();
              out.close();
          }
          catch(FileNotFoundException ex){
                return false;
          }
          catch(IOException e){
            return false;
          }
          
          return true;
   }
    
    /**
     * Permette la cancellazione di un file.
     * @param filename
     * @return 
     */
    public static boolean cancellaFile(String filename) {
        File f = new File(filename);
        
        if(f.exists()) {
            return f.delete();
        }
        
        return false;
        
    }
    
    /**
     * Il metodo permette il salvataggio di una grammatica su file XML.
     * @return true se l'operazione va a buon fine.
     */
    public static boolean salvaGrammaticaXML(String filename, Grammatica grammatica) {
        try {
            if(grammatica == null)
                return false;
            
            File file = new File(filename);
            file.createNewFile();
            XMLEncoder encoder = new XMLEncoder(new FileOutputStream(file));

            encoder.writeObject(grammatica);
            encoder.flush();
            return true;

        } catch (IOException ex) {
            return false;
        }
    }
    
    /**
     * Il metodo permette il caricamento di una grammatica da file XML.
     * @return ritorna la grammatica caricata.
     */
    public static Grammatica caricaGrammaticaXML(String filename) {
        try {
            File file = new File(filename);
            file.createNewFile();
            XMLDecoder decoder = new XMLDecoder(new FileInputStream(file));

            Grammatica grammatica = (Grammatica) decoder.readObject();
            return grammatica;

        } catch (IOException ex) {
            return null;
        }
    }
    
    /**
     * Il metodo permette il salvataggio di una grammatica su file in formato binario.
     * @return ritorna true se il salvataggio e' andato a buon fine.
     */
    public static boolean salvaGrammaticaBin(String filename, Grammatica grammatica) {
        try {
            
            if(grammatica == null)
                return false;
            
            FileOutputStream outFile= new FileOutputStream (filename);
            ObjectOutputStream objOut= new ObjectOutputStream (outFile);
            objOut.writeObject(grammatica);
            objOut.flush();
            objOut.close();
            outFile.close();
            
            return true;

        } catch (IOException ex) {
            return false;
        }
    }
    /**
     * Il metodo permette il caricamento di una grammatica da file binario.
     * @return ritorna la grammatica caricata.
     */
    public static Grammatica caricaGrammaticaBin(String filename) {
        try {
            
            FileInputStream inFile = new FileInputStream (filename);
            
            ObjectInputStream objIn= new ObjectInputStream (inFile);
            
            Grammatica grammatica = (Grammatica) objIn.readObject();
            
            
            objIn.close();
            inFile.close();
            return grammatica;

        } catch (IOException | ClassNotFoundException ex) {
            return null;
        }
    }
    
        
}
